package com.xiyou.weblog.admin.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiyou.weblog.admin.model.vo.tag.*;
import com.xiyou.weblog.admin.service.AdminTagService;
import com.xiyou.weblog.common.domain.dos.ArticleTagRelDO;
import com.xiyou.weblog.common.domain.dos.TagDo;
import com.xiyou.weblog.common.domain.mapper.ArticleTagRelMapper;
import com.xiyou.weblog.common.domain.mapper.TagMapper;
import com.xiyou.weblog.common.enums.ResponseCodeEnum;
import com.xiyou.weblog.common.exception.BizException;
import com.xiyou.weblog.common.model.vo.SelectRspVO;
import com.xiyou.weblog.common.utils.PageResponse;
import com.xiyou.weblog.common.utils.Response;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * @author xiyou
 * @description 文章标签
 */
@SuppressWarnings("SpringTransactionalMethodCallsInspection")
@Service
@Slf4j
public class AdminTagServiceImpl extends ServiceImpl<TagMapper,TagDo> implements AdminTagService {

    @Resource
    TagMapper tagMapper;
    @Resource
    ArticleTagRelMapper articleTagRelMapper;

    /**
     * 添加标签集合
     */
    @Override
    public Response addTag(AddTagReqVO addTagReqVO) {
        // VO 转 DO
        List<TagDo> tagsDOS = addTagReqVO.getTags()
                        .stream().map(tagName -> TagDo.builder()
                        .name(tagName.trim())// 去掉空格
                        .createTime(LocalDateTime.now())
                        .updateTime(LocalDateTime.now())
                        .build()).toList();
        // 批量插入
        // 忽略已添加的标签
        try {
            saveBatch(tagsDOS);
            // 关于事务失效的问题，查看https://www.quanxiaoha.com/column/10283.html
        } catch (Exception e) {
            log.warn("该标签已存在",e);
        }
        return Response.success();
    }


    /**
     * 标签分页数据查询
     */
    @Override
    public PageResponse findTagPageList(FindTagPageListReqVO findTagPageListReqVO) {
        // 获取当前页、以及每页需要展示的数据数量
        Long current = findTagPageListReqVO.getCurrent();
        Long size = findTagPageListReqVO.getSize();

        // 查询条件
        String name = findTagPageListReqVO.getName();
        LocalDate startDate = findTagPageListReqVO.getStartDate();
        LocalDate endDate = findTagPageListReqVO.getEndDate();

        // 分页查询
        Page<TagDo> page = tagMapper.selectPageList(current, size, name, startDate, endDate);

        // 目标数据可能为空
        List<TagDo> tagDos = page.getRecords();

        // DO 转 VO
        List<FindTagPageListRspVO> vos = null;
        if (!CollectionUtils.isEmpty(tagDos)) {
            vos = tagDos.stream().map(tagDo -> FindTagPageListRspVO.builder()
                    .id(tagDo.getId())
                    .name(tagDo.getName())
                    .createTime(tagDo.getCreateTime())
                    .build())
                    .toList();
        }

        return PageResponse.success(page,vos);
    }


    /**
     * 删除标签
     */
    @Override
    public Response deleteTag(DeleteTagReqVO deleteTagReqVO) {
        //标签 ID
        Long tagId = deleteTagReqVO.getId();

        // 校验该标签下是否有关联的文章，若有，则不允许删除，提示用户需要先删除标签下的文章
        ArticleTagRelDO articleTagRelDO = articleTagRelMapper.selectOneByTagId(tagId);

        if (Objects.nonNull(articleTagRelDO)) {
            log.warn("==> 此标签下包含文章，无法删除，tagId: {}", tagId);
            throw new BizException(ResponseCodeEnum.TAG_CAN_NOT_DELETE);
        }


        //删除标签
        int count = tagMapper.deleteById(tagId);

        return count == 1 ? Response.success() : Response.fail(ResponseCodeEnum.TAG_NOT_EXISTED);
    }

    /**
     * 根据关键词模糊查询
     */
    @Override
    public Response searchTag(SearchTagReqVO searchTagReqVO) {
        // 获取关键字
        String key = searchTagReqVO.getKey();

        // 执行模糊查询
        List<TagDo> tagDos = tagMapper.selectByKey(key);

        // DO 转 VO
        List<SelectRspVO> vos = null;

        if (!CollectionUtils.isEmpty(tagDos)) {
            vos = tagDos.stream().map(tagDo -> SelectRspVO.builder()
                    .label(tagDo.getName())
                    .value(tagDo.getId())
                    .build())
                    .toList();
        }

        return Response.success(vos);
    }

    /***
     * 查询标签 Select 列表数据
     */
    @Override
    public Response findTagSelectList() {
        // 查询所有标签, Wrappers.emptyWrapper() 表示查询条件为空
        List<TagDo> tagDos = tagMapper.selectList(Wrappers.emptyWrapper());

        // DO 转 VO
        List<SelectRspVO> vos = null;
        if (!CollectionUtils.isEmpty(tagDos)) {
            vos = tagDos.stream()
                    .map(tagDo -> SelectRspVO.builder()
                            .label(tagDo.getName())
                            .value(tagDo.getId())
                            .build())
                    .toList();
        }

        return Response.success(vos);
    }
}
